package com.xinqi.modules.course.clazz.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xinqi.common.mybatis.data.repo.SuperMapper;
import com.xinqi.modules.course.clazz.domain.ClassStudentEntity;
import com.xinqi.modules.course.clazz.dto.req.ClassStudentAppQueryDTO;
import com.xinqi.modules.course.clazz.dto.req.ClassStudentQueryDTO;
import com.xinqi.modules.course.clazz.dto.rsp.ClassStudentResultDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 班级学生表数据层
 *
 * @author: system
 * @date: 2023/01/17
 */
@Mapper
public interface ClassStudentMapper extends SuperMapper<ClassStudentEntity> {

    IPage<ClassStudentResultDTO> pageList(Page<ClassStudentEntity> page, @Param("query") ClassStudentQueryDTO query);

    List<ClassStudentResultDTO> findByList(@Param("classId") Long classId);

    List<ClassStudentResultDTO> findListByClassIdAndSearchKey(@Param("classId") Long classId, @Param("searchKey") String searchKey);

    IPage<ClassStudentResultDTO> pageListByRoles(Page<ClassStudentEntity> page, @Param("query") ClassStudentAppQueryDTO query, @Param("classRoles") List<String> classRoles);

    ClassStudentResultDTO findDetailById(@Param("id") Long id);

    ClassStudentResultDTO findUserInfoById(@Param("id") Long id);

    ClassStudentResultDTO findByStudentId(@Param("classId") Long classId, @Param("studentId") Long studentId);

    List<ClassStudentResultDTO> findByClassRole(@Param("classId") Long classId, @Param("classRole") String classRole);


    /**
     * 获取班级学生老师列表不包括注销用户
     *
     * @param classId
     * @return
     */
    List<ClassStudentEntity> findContainsTeacherListByClassId(@Param("classId") Long classId);

    /**
     * 查询班级当前有效学生(注销的不统计)
     *
     * @param classId
     * @return
     */
    List<ClassStudentEntity> selectClassStudents(@Param("classId") Long classId);

    /**
     * 查询班级当前所有成员(注销的不统计)
     *
     * @param classId
     * @return
     */
    List<ClassStudentEntity> selectClassAllUser(@Param("classId") Long classId);

    /**
     * 根据用户id（一般为登录用户id，也可以自己指定用户id）查询虚拟学生
     *
     * @param classId 班级id
     * @param userId  用户id
     * @return ClassStudentResultDTO
     */
    ClassStudentResultDTO findVirtualClassStudentByClassIdAndUserId(@Param("classId") Long classId, @Param("userId") Long userId);

    /**
     * 根据班级id和主学生id查询关系学生id
     *
     * @param classId            班级id
     * @param classStudentIdList 关系班级学生id
     * @return List<ClassStudentEntity>
     */
    List<ClassStudentResultDTO> findClassIdAndByMasterIdList(@Param("classId") Long classId, @Param("classStudentIdList") List<Long> classStudentIdList);

    List<ClassStudentResultDTO> findRelationStudentByClassIdAndImitateStudentId(@Param("classId") Long classId, @Param("studentId") Long studentId);

    List<ClassStudentEntity> findClassMasterStudentByClassIdList(@Param("classIdList") List<Long> classIdList);

    List<ClassStudentEntity> findRelationStudentListByClassIdAndMasterIdList(@Param("classId") Long classId, @Param("masterIdList") List<Long> masterIdList);

    List<ClassStudentEntity> findMasterAndRelationStudentByClassIdAndRelationStudentId(@Param("classId") Long classId, @Param("relationId") Long relationId);

    /**
     *
     * @param classId 班级id
     * @param userId 登录人id
     * @return 学生
     */
    ClassStudentResultDTO findClassStudentContainTeacherByClassIdAndUserId(@Param("classId")Long classId, @Param("userId")Long userId);
}
